package com.aipartner.service;

import com.aipartner.entity.CreditsTransaction;
import com.aipartner.entity.CreditsPackage;
import com.aipartner.entity.CreditsOrder;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.List;
import java.util.Map;

/**
 * 积分服务接口
 *
 * @author AI Partner
 * @since 2025-09-18
 */
public interface CreditsService {

    /**
     * 获取用户当前积分信息
     */
    Map<String, Object> getUserCreditsInfo(Long userId);

    /**
     * 获取用户积分交易记录
     */
    IPage<CreditsTransaction> getUserCreditsHistory(Long userId, Page<?> page);

    /**
     * 获取积分套餐列表
     */
    List<CreditsPackage> getCreditsPackages();

    /**
     * 创建积分购买订单
     */
    CreditsOrder createCreditsOrder(Long userId, Long packageId, String paymentMethod);

    /**
     * 处理积分购买成功回调
     */
    boolean processCreditsPaymentSuccess(String orderNo, String transactionId);

    /**
     * 消耗积分
     * @param userId 用户ID
     * @param amount 消耗数量
     * @param serviceType 服务类型
     * @param sourceId 来源ID
     * @param description 描述
     * @return 是否成功
     */
    boolean consumeCredits(Long userId, Long amount, String serviceType, String sourceId, String description);

    /**
     * 检查用户积分是否足够
     */
    boolean checkCreditsEnough(Long userId, Long amount);

    /**
     * 获取服务的积分消耗配置
     */
    Long getServiceCreditsCost(String serviceType);

    /**
     * 获取积分消耗规则
     */
    List<Map<String, Object>> getCreditsConsumptionRules();

    /**
     * 添加积分（用于测试或奖励）
     * @param userId 用户ID
     * @param amount 添加数量
     * @param sourceType 来源类型
     * @param sourceId 来源ID
     * @param description 描述
     * @return 是否成功
     */
    boolean addCredits(Long userId, Long amount, String sourceType, String sourceId, String description);

    /**
     * 重置用户积分（仅用于开发测试）
     * @param userId 用户ID
     * @param newAmount 新的积分数量
     * @return 是否成功
     */
    boolean resetUserCredits(Long userId, Long newAmount);
    
    // ==================== 管理端相关方法 ====================
    
    /**
     * 获取管理端积分统计数据
     */
    java.util.Map<String, Object> getAdminCreditsStats();
    
    /**
     * 获取管理端积分交易记录
     */
    com.baomidou.mybatisplus.extension.plugins.pagination.Page<CreditsTransaction> getAdminCreditsHistory(
        com.baomidou.mybatisplus.extension.plugins.pagination.Page<CreditsTransaction> page, 
        String userId, 
        String transactionType);
    
    /**
     * 获取管理端订单统计数据
     */
    java.util.Map<String, Object> getAdminOrderStats();

    // ==================== 订单管理相关方法 ====================
    
    /**
     * 获取管理员订单列表（分页）
     */
    com.baomidou.mybatisplus.extension.plugins.pagination.Page<CreditsOrder> getAdminOrderList(
            com.baomidou.mybatisplus.extension.plugins.pagination.Page<CreditsOrder> page,
            String orderNo, String userId, String orderType, String status);
    
    /**
     * 取消订单
     */
    boolean cancelOrder(Long orderId);
    
    /**
     * 退款订单
     */
    boolean refundOrder(Long orderId, String reason, java.math.BigDecimal refundAmount);
    
    // ==================== 积分套餐管理方法 ====================
    
    /**
     * 创建积分套餐
     */
    boolean createCreditsPackage(CreditsPackage creditsPackage);
    
    /**
     * 更新积分套餐
     */
    boolean updateCreditsPackage(Long packageId, CreditsPackage creditsPackage);
    
    /**
     * 删除积分套餐
     */
    boolean deleteCreditsPackage(Long packageId);
    
    /**
     * 更新积分套餐状态
     */
    boolean updateCreditsPackageStatus(Long packageId, Integer status);
    
    /**
     * 获取管理端积分套餐（包括下架的，用于管理端）
     */
    List<CreditsPackage> getAdminCreditsPackages();
    
    // ==================== 积分消耗规则管理方法 ====================
    
    /**
     * 创建积分消耗规则
     */
    boolean createCreditsRule(String type, String name, Long cost, String unit, String description);
    
    /**
     * 更新积分消耗规则
     */
    boolean updateCreditsRule(Long ruleId, String type, String name, Long cost, String unit, String description);
    
    /**
     * 删除积分消耗规则
     */
    boolean deleteCreditsRule(Long ruleId);
    
    /**
     * 更新积分消耗规则状态
     */
    boolean updateCreditsRuleStatus(Long ruleId, Integer status);
    
    /**
     * 获取所有积分消耗规则（包括禁用的，用于管理端）
     */
    List<Map<String, Object>> getAllCreditsRules();
    
    // ==================== 同步小程序数据库 ====================
    
    /**
     * 同步积分套餐数据到小程序数据库
     */
    boolean syncCreditsPackagesToMiniProgram();
    
    /**
     * 同步积分消耗规则到小程序数据库
     */
    boolean syncCreditsRulesToMiniProgram();
}
